

-- 三个 参数
-- local 声明的 都是 局部 变量  不然 就是 全局 变量
local  voucherId = ARGV[1]   -- lua 的数组 下标 从 1 开始

local userId = ARGV[2]

local orderId = ARGV[3]

-- 判断 库存 是否 重组  lua 也是 去 查  redis

-- 2.数据key
-- 2.1.库存key
local stockKey = 'seckill:stock:' .. voucherId
-- 2.2.订单key
local orderKey = 'seckill:order:' .. voucherId  -- 订单 Id 指的 是 订单的 优惠券的 voucherID 所以 库存 和

-- 查询 数据库

if(tonumber(redis.call('get',stockKey))<=0) then
    return 1
end

if(redis.call('SISMEMBER',orderKey,userId)==1) then
    return 2
end

--  通过 检查 之后 就 可以 扣库存 将用户 添加 到 orderkey 代表的集合 里面 代表 这个 用户 已经 买过了
-- 这种 处理 是 逻辑上的  没有 存入数据库， 所以需要 有人来 存  同时 要让 客户知道 自己的 做好了  为了 知道 客户的 是 哪一个 所以 有一个标识 这个 标识 就是 订单的 ID 并且 是全局ID 即可以 应对分布式 场景

-- 扣减 库存keyr
redis.call('incrby',stockKey,-1)
redis.call('sadd',orderKey,userId)

-- 就可以 告知 后厨 可以 开始 做了
-- 消息队列  5.0 之后 使用 stream 来专门 做 消息队列

redis.call('xadd', 'stream.orders', '*', 'userId', userId, 'voucherId', voucherId, 'id', orderId)

return 0